Retrofit
Retrofit是針對Android的網絡請求框架,遵循Restful設計風格,支持同步/異步網絡請求與數據的解析,並且通過註解配置網絡請求參數。
Retrofit很強大這邊就介紹最一般的讀取Json利用GsonConverterFactory解析資料。
addConverterFactory("解析器"):回傳資料解析器
baseUrl("URL"):固定的API網址,後續要只需要在service中增加API
@GET("連線API的URL"):利用GET方式取得API
Retrofit配合Coroutines,並且使用Gson解析器
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
}
讀取網路增加權限(AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET"/>
創建RetrofitUtil(變成工具類方便創建)
class RetrofitUtil {
private var retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://gank.io/api/")
.build()
companion object {
val instance : RetrofitUtil by lazy { RetrofitUtil() }
}
fun <T> getService(clazz: Class<T>) = retrofit.create(clazz)
}
定義回傳的資料
data class HttpResult(val data: List<MyModel>, val total_counts: Int)
data class MyModel(val author: String, val category: String, val desc: String, val title: String)
創建interface 要使用的API放在這
interface MyService {
@GET("v2/data/category/Girl/type/Girl/page/1/count/10")
suspend fun getPage() : HttpResult
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
//宣告懶加載
private val myService by lazy {
RetrofitUtil.instance.getService(MyService::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
CoroutineScope(Dispatchers.IO).launch {
val pages = myService.getPage()
for (page in pages.data) {
Log.d("GG-data", page.title)
}
Log.d("GG-data size", pages.data.size.toString())
Log.d("GG-total size", pages.total_counts.toString())
}
}
}